package Z.dailyExercise.April;

import java.util.Arrays;
import java.util.Comparator;

public class _179最大数 {
    public static void main(String[] args) {
        int[] test = new int[]{3,30,34,5,9};
        _179最大数 t = new _179最大数();
        t.largestNumber(test);
    }
    /**
     * 长度固定的前提下 尽可能让第一位大的数字放在前面 如果第一位相同 那么按照数字大小
     * 第一位相同 但是一个多位 一个个位 那么看后面位是否大于高位
     * -大于 就选多位  否则就各位
     *
     * --借鉴桶排序的思想--好复杂 不会了
     *
     * 题解：直接用比较器 字符串比较大小
     * @param nums
     * @return
     */
    StringBuffer res = new StringBuffer();
    public String largestNumber(int[] nums) {

        int[][] buckets = new int[10][nums.length];
        int[] counter = new int[10];

        //分桶
        for (int num:nums){
            int digit_count = (num+"").length();
            int high = num / (int) Math.pow(10,digit_count-1);
            buckets[high][counter[high]++] = num;
        }

        //桶内排序
        for (int i =8;i>=0;i--){
            helper(buckets[i],counter[i]);
        }
        System.out.println(res);

        return res.toString();


    }

    //桶内计算 先判断有没有各位 如果没有 那就直接逆向输出
    //对比大小 自定排序
    public void helper(int[] num,int count){
        Integer[] n = new Integer[count];
        for (int i = 0; i < count; i++) {
            n[i] = num[i];
        }
        Arrays.sort(n,new Comparator<Integer>(){
            @Override
            public int compare(Integer o1, Integer o2) {
                String s1 = o1 +""+o2;
                String s2 = o2 +""+o1;

                return s2.compareTo(s1);
            }
        });

        for (int i = 0; i < count; i++) {
            res.append(n[i]);
        }
    }

    public String largestNumber1(int[] nums){
        Integer[] n = new Integer[nums.length];
        for (int i = 0; i < nums.length; i++) {
            n[i] = nums[i];
        }
        Arrays.sort(n,new Comparator<Integer>(){
            @Override
            public int compare(Integer o1, Integer o2) {
                String s1 = o1 +""+o2;
                String s2 = o2 +""+o1;

                return s2.compareTo(s1);
            }
        });

        for (int i = 0; i < nums.length; i++) {
            res.append(n[i]);
        }
        return res.charAt(0)=='0'?"0":res.toString();

    }


}
